
/**
 * @file Enseignant.h
 * @brief Fichier d'entête du module Eenseigant.
 *
 * @author Mohammad NOROUZZADEH, Lotfi, Salah
 */
#ifndef _ENSEIGNANT_H
#define _ENSEIGNANT_H

/* ********************************************************************* */
/*                                                                       */
/*                       Librairies de Ens                                */
/*                                                                       */
/* ********************************************************************* */

#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "UtilStr.h"

#include "Chemin.h"

/* ********************************************************************* */
/*                                                                       */
/*                        Définitions de types                           */
/*                                                                       */
/* ********************************************************************* */

/**
 * @struct Ens
 * @brief Structure utilisée pour la gestion d'une Ens.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */
struct sEnseignant
	{
	    int numEns;
		char * nomEns;
		char *prenomEns;
	};

/**
 * @typedef Ens
 * @brief Redéfinit la structure sEns
 */
typedef struct sEnseignant Ens ;


/**
 * @struct sTabEnseignant
 * @brief Structure utilisée pour la gestion d'une Ens.
 *
 * Cette structure est utilisée pour gérer .Les champs de cette structures
   doivent être modifiés ou lus par les accesseurs et mutateurs.
 */
struct sTabEnseignant
{
    Ens ** tabEns;
    int nbEns;
};
/**
 * @typedef TabEnseignant
 * @brief Redéfinit la structure sTabEnseignant
 */

typedef struct sTabEnseignant  TabEnseignant;

/**
 * @fn void initEns(Ens * Ens,const int numEns,const char * nomEns,const char * prenomEns);
 * @brief Initialise un Ens.
   initEns initialise numEns, nomEns et prenomEns (après vérification) de la structure Ens

 * @param[in, out] ens Pointeur vers l'ens à initialiser.
 * @param[in] numEns Code de l'Ens.
 * @param[in] nomEns nomEns de l'Ens.
 * @param[in] prenomEns prenomEns de l'Ens.
 * @rensrn 0 si tout est OK
 */
void initEns(Ens * enseignant, const int numEns,const char * nomEns,const char * prenom);

/**
 * @fn Ens * creEns(const int numEns,const char * nomEns,const char * prenomEns);
 * @brief Crée un Ens en mémoire.

 * @param[in] numEns Code de l'Ens.
 * @param[in] nomEns Hauteur de l'Ens.
 * @param[in] prenomEns prenomEns de l'Ens.
 * @rensrn un pointeur vers un Ens
 */
Ens *creEns(const int numEns, const char *nomEns, const char *prenomEns);

/**
 * @fn void libEns(Ens * ens);
 * @brief Libere un Ens en mémoire.

 * @param[in, out] ens Pointeur vers l'ens.
 * @rensrn 0 si tout est OK
 */
void libEns(Ens *enseignant);

/**
 * @fn detruireEns(Ens ** ens);
 * @brief Détruit un Ens en mémoire.

 * @param[in, out] ens Pointeur vers l'ens.
 * @rensrn 0 si tout est OK
 */
void detEns(Ens ** enseignant);

/* ******************************************************************** */
/*																		*/
/*           Accesseurs et Mutateurs de la structure Ens                */
/*																		*/
/* ******************************************************************** */

/**
 * @fn int getNumEns(const Ens * ens);
 * @brief rensrner numEns.

 * @param[in] ens pointeur vers l'ens.
 * @rensrn numEns
 */
int getNumEns(const Ens *enseignant);

/**
 * @fn void setnumEns(Ens * ens, int numEns);
 * @brief modifie le champ numEns de l'ens.

 * @param[in, out] ens Pointeur vers l'ens.
 * @param[in] numEns Code de l'Ens.
 * @rensrn 0 si tout est OK
 */
void setNumEns(Ens *enseignant,const int numEns);

/**
 * @fn char * getNomEns(const Ens * ens);
 * @brief rensrner nomEns.

 * @param[in] ens pointeur vers l'ens.
 * @rensrn nomEns.
 */

char * getNomEns(const Ens *enseignant);

/**
 * @fn void setNomEns(Ens * ens,const char * nomEns);
 * @brief modifie le champ nomEns de l'ens.

 * @param[in, out] ens Pointeur vers l'ens.
 * @param[in] nomEns nomEns de l'Ens.
 * @rensrn 0 si tout est OK.
 */
void setNomEns(Ens *enseignant,const char *nomEns);

/**
 * @fn char * getPrenomEns(const Ens * ens);
 * @brief rensrner nomEns.

 * @param[in] ens pointeur vers l'ens.
 * @rensrn nomEns.
 */
char * getPrenomEns(const Ens *enseignant);

/**
 * @fn void setPrenomEns(Ens * ens, const char *prenomEns);
 * @brief modifie le champ nomEns de l'ens.

 * @param[in, out] ens Pointeur vers l'ens.
 * @param[in] nomEns nomEns de l'Ens.
 * @rensrn 0 si tout est OK.
 */
void setPrenomEns(Ens *enseignant,const char *prenomEns);

/**
 * @fn void affEns(const Ens * ens);
 * @brief Afficher l'ens.

 * @param[in] ens pointeur vers l'ens.
 * @rensrn 0 si tout est OK
 */
void affEns(const Ens *enseignant);

/* ********************************************************************* */
/*                                                                       */
/*             Fonctions relatives aux gestiond'Ens                       */
/*                                                                       */
/* ********************************************************************* */

/**
 * @fn void savEnsParElem(const int numEns,const char * nomEns,const char * prenomEns, );
 * @brief saover Ens dans un fichier binaire.
 *
 * @param[in] numEns .
 * @param[in] nomEns .
 * @param[in] prenomEns .

 * @rensrn 0 si tout est OK.
 */
void savEnsParElem(const int numEns,const char * nomEns,const char * prenomEns);


/**
 * @fn void savEns(const   Ens*ens);
 * @brief saover Ens dans un fichier binaire.
 *
 * @param[in] Ens .

 * @rensrn 0 si tout est OK.
 */
void savEns(const   Ens*ens);

/**
 * @fn int rchEnsParCode(const int codeEns, );
 * @brief recherche Ens dans un fichier binaire.
 *
 * @param[in] numEns .

 * @rensrn 0 s'il n'existe pas.
 * @rensrn 1 s'il existe.
 */
int rchEnsParCode(const int numEns);

/**
 * @fn Ens *recEnsParCode(const int codeEns, );
 * @brief recupérer Ens dans un fichier binaire.
 *
 * @param[in] numEns .

 * @rensrn Ens s'il n'existe pas.
 * @rensrn NULL s'il existe.
*/
Ens *recEnsParCode(const int numEns);

/**
 * @fn int supEnsParCode(const int codeEns);
 * @brief supprimer Ens dans un fichier binaire.
 *
 * @param[in] numEns .

 * @rensrn -1 s'il n'existe pas.
 * @rensrn 0 s'il supprime.
 */
int supEnsParCode(const int numEns);

/**
 * @fn int supEns(Ens  *ens);
 * @brief supprimer Ens dans un fichier binaire.
 *
 * @param[in] Ens .

 * @rensrn -1 s'il n'existe pas.
 * @rensrn 0 s'il supprime.
 */
int supEns(Ens  *ens);

/**
 * @fn int mdfEnsParCode(const int numEns, const Ens *ensew );
 * @brief modifier Ens dans un fichier binaire.
 *
 * @param[in] numEns .

 * @rensrn -1 s'il n'existe pas.
 * @rensrn 0 s'il supprime.
 */
int mdfEnsParCode(const int numEns, const Ens *ensew );

/**
 * @fn int modifEns(Ens*ens,Ens*ensnew);
 * @brief modifier Ens dans un fichier binaire.
 *
 * @param[in] numEns .

 * @rensrn -1 s'il n'existe pas.
 * @rensrn 0 s'il supprime.
 */
int modifEns(Ens*ens,Ens*ensnew);

/**
 * @fn mdfEnsParCode(const int codeEns, const Ens *nEns, );
 * @brief modifier Ens dans un fichier binaire.
 *
 * @param[in] numEns .
 * @param[in] Ens .

 * @rensrn -1 s'il n'existe pas.
 * @rensrn 1 s'il modifie.
 * @rensrn 0 si non.
 */
int mdfEnsParCode(const int numEns, const Ens *pEns);

/**
 * @fn affEns_DB();
 * @brief Afficher base de donnee de Ens .

 * @rensrn 0 si tout est OK.
 */
void affEns_DB();

/**
 * @fn void regEns() ;
 * @brief Test le module Ens
 */
void regEns();

#endif
